﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using Data;
using FormGridPadrao;

namespace FormCadastroPadrao
{
    public partial class FormCadastro : Form
    {
        public List<Dados> campos;
        protected List<string> camposName { get; set; }
        protected List<Object> values { get; set; }
        protected string tabela { get; set; }
        public frmFormGridPadrao grid { get; set; }
        protected DataTable dttbl { get; set; }
        public bool insert { get; set; }
        private bool habSalvar = true;
        private bool controleAlter = true;
        public List<Object> indexCombo { get; set; }
        public string cod_anexo { get; set; }
        private string key;
        protected bool habInserir = true;
        protected bool habAlterar = true;
        protected bool habExcluir = true;

        public FormCadastro()
        {
            InitializeComponent();
            this.camposName = new List<string>();
            this.values = new List<object>();
            this.indexCombo = new List<Object>();
        }

        public void habilitaInserir(bool habilita)
        {
            habInserir = habilita;
            tlstrpbtnIncluir.Enabled = habilita;
        }

        public void habilitaAlterar(bool habilita)
        {
            habAlterar = habilita;
            tlstrpbtnAlterar.Enabled = habilita;
        }

        public void habilitaExcluir(bool habilita)
        {
            habExcluir = habilita;
            tlstrpbtnExcluir.Enabled = habilita;
        }

        public void insereAnexo(string caption, string form)
        {
            this.SuspendLayout();
            ToolStripMenuItem item = new ToolStripMenuItem();
            item.Text = caption;
            item.Name = "tlstrpmntm" + caption;
            item.Tag = form;
            item.Click += new EventHandler(this.itemClick);

            tlstrpspltBtnAnexos.DropDown.Items.Add(item);

            this.ResumeLayout();
        }

        public void itemClick(object sender, EventArgs e)
        {
            ToolStripMenuItem item = sender as ToolStripMenuItem;
            Type t = Type.GetType(item.Tag.ToString());

            MessageBox.Show(t.ToString());

            if (t != null)
            {
                FormCadastro f = (FormCadastro)Activator.CreateInstance(t);
                f.Show();
                MessageBox.Show("Entrou");
            }
            MessageBox.Show("Não entrou");
        }

        private void btnOk_Click(object sender, EventArgs e)
        {
            tlstrpbtnGravar_Click(sender, e);
            this.Close();
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private void btnSalvar_Click(object sender, EventArgs e)
        {
            tlstrpbtnGravar_Click(sender, e);
        }

        private void fecharAnexoToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.Close(); ;
        }

        public void addCampo(string campo, string componenteCampo, bool nulo, bool autoinc, Dados.tipo tipoCampo, string label)
        {
            Dados c = new Dados(campo, componenteCampo, nulo, autoinc, tipoCampo, label);
            this.campos.Add(c);
        }

        public virtual void tlstrpbtnIncluir_Click(object sender, EventArgs e)
        {
            if (habInserir)
            {
                this.insert = true;
                clearFields();
                btnSalvar.Enabled = true;
                Control[] c = tabPage1.Controls.Find(campos[0].ComponenteCampo, true);
                if (cod_anexo != null)
                {
                    c[0].Text = cod_anexo;
                }
                if (campos[0].Autoinc)
                {
                    c[0].Enabled = false;
                }
                else
                {
                    if (cod_anexo == null)
                    {
                        c[0].Enabled = true;
                    }
                    else
                    {
                        c[0].Enabled = false;
                    }
                }
            }
        }

        private void tlstrpbtnGravar_Click(object sender, EventArgs e)
        {
            if (recuperarInput())
            {
                if (validacaoAdicional())
                {
                    gravar();
                }
            }
        }

        public bool jaCadastrado(bool insert)
        {
            foreach (Dados dado in campos)
            {
                if (dado.Campo == "Codigo" || dado.Campo == "Nome" || dado.Campo == "CNPJ")
                {
                    if (dado.Campo == "Codigo" && !insert)
                    {
                        continue;
                    }
                    List<string> camposcad = new List<string>();
                    camposcad.Add(dado.Campo);
                    //string cond = "Codigo not in (select Codigo from " + this.tabela + " where " + dado.Campo + " = '" + dado.getValue(tabPage1) + "') and " + dado.Campo + " = '" + dado.getValue(tabPage1) + "'";
                    string cond = dado.Campo + " = '" + dado.getValue(tabPage1) + "'";
                    if (!insert)
                    {
                        cond += " and " + campos[0].Campo + " <> '" + key + "'";
                    }
                    string sql = SqlCrud.getInstance.select(this.tabela, camposcad, cond);
                    DataTable dt = Conexao.getInstance.executeQuery(sql);
                    if (dt.Rows.Count > 0)
                    {
                        MessageBox.Show("Este " + dado.Campo + " já foi cadastrado", "Erro!", MessageBoxButtons.OK, MessageBoxIcon.Warning);
                        return true;
                    }
                }
            }
            return false;
        }
        private void gravar()
        {
            string sql = "";
            //string msg;
            string msgErro = "";


            if (this.insert)
            {
                if (jaCadastrado(this.insert))
                {
                    return;
                }

                sql = SqlCrud.getInstance.insert(this.tabela, this.camposName, this.values);
                //msg = "Cadastro realizado com sucesso";
                msgErro = "Não foi possível realizar o cadastro!";
            }
            else
            {
                if (cod_anexo == null)
                {
                    if (jaCadastrado(this.insert))
                    {
                        return;
                    }

                    sql = SqlCrud.getInstance.updateById(this.tabela, getAlteracoes(), this.campos[0].Campo, getId());
                }
                else
                {
                    sql = SqlCrud.getInstance.updateByIdComposto(this.tabela, getAlteracoes(), this.campos[0].Campo, getId(),
                        this.campos[1].Campo, getId2());
                }
                //msg = "Editado com sucesso!";
                msgErro = "Não foi possível realizar a alteração!";
            }

            try
            {
                if (Conexao.getInstance.execute(sql))
                {

                    int indice = 0;
                    if (grid.dtgrdvwDados.RowCount > 0)
                    {
                        indice = grid.dtgrdvwDados.CurrentRow.Index;
                    }
                    if (this.grid != null) { this.grid.carregaGrid(); }
                    if (cod_anexo == null)
                    {
                        grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[0, indice];
                    }
                    else
                    {
                        grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[1, indice];
                    }

                    //MessageBox.Show(this.Text + " " + msg,"Aviso",MessageBoxButtons.OK,MessageBoxIcon.Information);
                    habilitaBotoes();
                    btnSalvar.Enabled = false;
                    insert = false;
                    Control[] c = tabPage1.Controls.Find(campos[0].ComponenteCampo, true);
                    c[0].Enabled = false;
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(msgErro + "\n\nERRO: " + ex.Message + "\n\nSQL: " + sql, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }

        private object getId()
        {
            object value = this.campos[0].getValue(tabPage1);
            return value;
        }

        private object getId2()
        {
            object value = this.campos[1].getValue(tabPage1);
            return value;
        }

        private List<string> getAlteracoes()
        {
            List<string> alteracoes;
            alteracoes = new List<string>();
            Object value;
            foreach (Dados campo in this.campos)
            {
                if (campo.Campo != "Codigo")
                {
                    value = campo.getValue(tabPage1);
                    if (value.GetType() == typeof(string))
                    {
                        alteracoes.Add(campo.Campo + " = '" + value + "'");
                    }
                    else
                    {
                        alteracoes.Add(campo.Campo + " = " + value);
                    }
                }
            }
            return alteracoes;
        }

        private bool recuperarInput()
        {
            Object value;
            limparListas();
            foreach (Dados d in campos)
            {
                if (!d.Autoinc)
                {
                    value = d.getValue(tabPage1);

                    if (value != null && value is int && (int)(value) == -1)
                    {
                        limparListas();
                        return false;
                    }
                    if (value != null)
                    {
                        this.camposName.Add(d.Campo);
                        this.values.Add(value);
                    }
                }
            }
            return true;
        }

        private void limparListas()
        {
            this.camposName.Clear();
            this.values.Clear();
        }


        public void getValueFromCbo(string tabela, string campo, string valor)
        {
            /*DataTable dt = Conexao.getInstance.executeQuery(SqlCrud.getInstance.selectLike(tabela, campo, valor));
            DataRow row = dt.Rows[0];

            this.values.Add(int.Parse(row[0].ToString()));*/
        }

        public string getNextCodigo()
        {
            DataTable dt = Conexao.getInstance.executeQuery(SqlCrud.getInstance.selectMax(this.tabela));
            DataRow row = dt.Rows[0];


            return (row[0].ToString() == "") ? "1" : (int.Parse(row[0].ToString()) + 1).ToString();

            //traz o codigo do proximo cadastro (autoinc)

            //se tabela é vazia retorna 1, senão retorna o ultimo elemento do autoinc + 1
        }

        public string getNextDataInicio()
        {
            DataTable dt = Conexao.getInstance.executeQuery("Select max(DataTermino) from PeriodoCompetencia");
            DataRow row = dt.Rows[0];

            return (row[0].ToString() == "") ? ("") : row[0].ToString();

        }

        public void clearFields()
        {
            foreach (Control c in tabPage1.Controls)
            {
                if (c is TextBox)
                {
                    c.Text = "";
                }
                else if (c is CheckBox)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c.Name, true);
                    CheckBox chk = (CheckBox)ctrl[0];
                    chk.Checked = true;
                    ctrl[0] = (Control)chk;
                }
                else if (c is ComboBox)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c.Name, true);
                    ComboBox cbx = (ComboBox)ctrl[0];
                    cbx.SelectedIndex = -1;
                    ctrl[0] = (Control)cbx;
                }
                else if (c is NumericUpDown)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c.Name, true);
                    NumericUpDown n = (NumericUpDown)ctrl[0];
                    n.Value = n.Minimum;
                    ctrl[0] = (Control)n;
                }
                else if (c is MaskedTextBox)
                {
                    c.Text = "";
                }
                else if (c is DateTimePicker)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c.Name, true);
                    DateTimePicker n = (DateTimePicker)ctrl[0];
                    n.Value = DateTime.Now;
                    ctrl[0] = (Control)n;
                }
            }
            foreach (Dados d in campos)
            {
                if (d.Autoinc)
                {
                    if (d.Campo != "Periodo")
                    {
                        Control[] ctrl = tabPage1.Controls.Find(d.ComponenteCampo, true);
                        TextBox txt = (TextBox)ctrl[0];
                        txt.Text = getNextCodigo();
                        txt.ReadOnly = true;
                        ctrl[0] = (Control)txt;
                    }
                }
            }
            Control[] c1 = tabPage1.Controls.Find(campos[0].ComponenteCampo, true);
            c1[0].Enabled = false;
            controleAlter = false;
        }

        public void findRow(string chave)
        {
            habSalvar = false;
            this.camposName.Clear();
            foreach (Dados d in campos)
            {

                this.camposName.Add(d.Campo);
            }

            List<string> l = new List<string>();
            l.Add(this.tabela);
            string sql = SqlCrud.getInstance.select(l, this.camposName, this.campos[0].Campo + " = '" + chave + "'");

            DataTable registro = Conexao.getInstance.executeQuery(sql);

            fillFields(registro);
            key = campos[0].getValue(tabPage1).ToString();
            habSalvar = true;
            btnSalvar.Enabled = false;
        }

        public void findRowComposto(string chave1, string chave2)
        {
            habSalvar = false;
            this.camposName.Clear();
            foreach (Dados d in campos)
            {

                this.camposName.Add(d.Campo);
            }

            List<string> l = new List<string>();
            l.Add(this.tabela);
            string sql = SqlCrud.getInstance.select(l, this.camposName, this.campos[0].Campo + " = '" + chave1 + "' and "
                            + this.campos[1].Campo + " = '" + chave2 + "'");

            DataTable registro = Conexao.getInstance.executeQuery(sql);

            fillFields(registro);
            habSalvar = true;
            btnSalvar.Enabled = false;
        }

        public void fillFields(DataTable dttbl)
        {
            int i = 0;
            foreach (Dados d in campos)
            {
                Control[] c = tabPage1.Controls.Find(d.ComponenteCampo, true);
                if (c[0] is TextBox)
                {
                    c[0].Text = dttbl.Rows[0][i].ToString();
                    i++;
                }
                else if (c[0] is CheckBox)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c[0].Name, true);
                    CheckBox chk = (CheckBox)ctrl[0];

                    chk.Checked = !(dttbl.Rows[0][i].ToString().Equals("0"));

                    ctrl[0] = (Control)chk;
                    i++;
                }
                else if (c[0] is ComboBox)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c[0].Name, true);
                    ComboBox cb = (ComboBox)ctrl[0];

                    if (cb.ValueMember == "")
                    {
                        cb.SelectedIndex = Convert.ToInt32(dttbl.Rows[0][i].ToString());
                    }
                    else
                    {
                        try
                        {
                            if (dttbl.Rows[0][i].GetType() == typeof(int))
                            {
                                cb.SelectedValue = Convert.ToInt32(dttbl.Rows[0][i].ToString());//funcionar os btns navegação
                                indexCombo.Add(Convert.ToInt32(dttbl.Rows[0][i].ToString()));// recuperar pro metodo ONshow;
                            }
                            else
                            {
                                cb.SelectedValue = (dttbl.Rows[0][i].ToString());//funcionar os btns navegação
                                indexCombo.Add(dttbl.Rows[0][i].ToString());// recuperar pro metodo ONshow;
                            }
                        }
                        catch
                        { }
                    }

                    ctrl[0] = (ComboBox)cb;
                    i++;
                    // value = (cb.ValueMember == "") ? cb.SelectedIndex : cb.SelectedValue;
                }
                else if (c[0] is NumericUpDown)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c[0].Name, true);
                    NumericUpDown n = (NumericUpDown)c[0];
                    n.Value = Convert.ToInt32(dttbl.Rows[0][i].ToString());
                    ctrl[0] = n;
                    i++;
                }
                else if (c[0] is MaskedTextBox)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c[0].Name, true);
                    MaskedTextBox m = (MaskedTextBox)c[0];
                    m.Text = dttbl.Rows[0][i].ToString();
                    ctrl[0] = m;
                    i++;
                }
                else if (c[0] is DateTimePicker)
                {
                    Control[] ctrl = tabPage1.Controls.Find(c[0].Name, true);
                    DateTimePicker m = (DateTimePicker)c[0];
                    m.Text = dttbl.Rows[0][i].ToString();
                    ctrl[0] = m;
                    i++;
                }

                if (!habAlterar)
                {
                    c[0].Enabled = false;
                }
            }
        }

        public void tlstrpbtnAlterar_Click(object sender, EventArgs e)
        {
            if (habAlterar)
            {
                this.insert = false;
                habilitaBotoes();
                btnSalvar.Enabled = true;
                Control[] c = tabPage1.Controls.Find(campos[0].ComponenteCampo, true);
                c[0].Enabled = false;
            }
        }

        public void setarAlterarSalvar(object sender, EventArgs e)
        {
            if (insert)
            {
                btnSalvar.Enabled = true;
                if (!tlstrpbtnGravar.Enabled)
                {
                    habilitaBotoes();
                }
            }
            if (campos != null)
            {

                foreach (Dados d in campos)
                {
                    Control[] c = tabPage1.Controls.Find(d.ComponenteCampo, true);
                    if (c[0] is TextBox)
                    {
                        TextBox tb = (TextBox)(c[0]);
                        tb.TextChanged += alteraSalvar;
                    }
                    else if (c[0] is CheckBox)
                    {
                        CheckBox cb = (CheckBox)(c[0]);
                        cb.CheckedChanged += alteraSalvar;
                    }
                    else if (c[0] is ComboBox)
                    {
                        ComboBox cb = (ComboBox)(c[0]);
                        if (cb.ValueMember == "")
                        {
                            cb.Click += alteraSalvar;
                        }
                        else
                        {
                            cb.Click += alteraSalvar;
                        }
                    }
                    else if (c[0] is MaskedTextBox)
                    {
                        c[0].TextChanged += alteraSalvar;
                    }
                    else if (c[0] is NumericUpDown)
                    {
                        NumericUpDown num = (NumericUpDown)(c[0]);
                        num.ValueChanged += alteraSalvar;
                    }
                    else if (c[0] is DateTimePicker)
                    {
                        DateTimePicker num = (DateTimePicker)(c[0]);
                        num.ValueChanged += alteraSalvar;
                    }

                }
            }
        }

        public void habilitaBotoes()
        {
            if (habInserir)
            {
                //tlstrpbtnIncluir.Enabled = tlstrpbtnGravar.Enabled;
                tlstrpbtnIncluir.Enabled = !tlstrpbtnIncluir.Enabled;
            }
            if (habAlterar)
            {
                //tlstrpbtnAlterar.Enabled = tlstrpbtnGravar.Enabled;
                tlstrpbtnAlterar.Enabled = !tlstrpbtnAlterar.Enabled;
            }
            if (habExcluir)
            {
                //tlstrpbtnExcluir.Enabled = tlstrpbtnGravar.Enabled;
                tlstrpbtnExcluir.Enabled = !tlstrpbtnExcluir.Enabled;
            }
            //tlstrpbtnRefresh.Enabled = tlstrpbtnGravar.Enabled;
            tlstrpbtnRefresh.Enabled = !tlstrpbtnRefresh.Enabled;

            if (!tlstrpbtnGravar.Enabled)
            {
                tlstrpbtnPrimeiro.Enabled = false;
                tlstrpbtnProximo.Enabled = false;
                tlstrpbtnAnterior.Enabled = false;
                tlstrpbtnUltimo.Enabled = false;
            }
            else
            {
                ajustaBotoesMovimentacao();
            }

            tlstrpspltBtnAnexos.Enabled = tlstrpbtnGravar.Enabled;

            //tlstrpbtnGravar.Enabled = !tlstrpbtnIncluir.Enabled;
            //tlstrpbtnCancelar.Enabled = !tlstrpbtnIncluir.Enabled;
            tlstrpbtnGravar.Enabled = !tlstrpbtnGravar.Enabled;
            tlstrpbtnCancelar.Enabled = !tlstrpbtnCancelar.Enabled;

            if (grid != null)
            {
                if (grid.dtgrdvwDados.RowCount == 0 && tlstrpbtnIncluir.Enabled)
                {
                    tlstrpbtnIncluir.Enabled = true;
                    tlstrpbtnAlterar.Enabled = false;
                    tlstrpbtnExcluir.Enabled = false;
                    tlstrpbtnRefresh.Enabled = true;
                    tlstrpbtnGravar.Enabled = false;
                    tlstrpbtnCancelar.Enabled = false;
                    ajustaBotoesMovimentacao();
                }
            }
        }

        private void tlstrpbtnCancelar_Click(object sender, EventArgs e)
        {
            string valorChave = "";
            string valorChave2 = "";
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                if (cod_anexo == null)
                {
                    if (insert)
                    {
                        valorChave = grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString();
                    }
                    else
                    {
                        Control[] c = tabPage1.Controls.Find(this.campos[0].ComponenteCampo, true);
                        valorChave = c[0].Text;
                    }
                    findRow(valorChave);
                }
                else
                {
                    if (insert)
                    {
                        valorChave = grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString();
                        valorChave2 = grid.dtgrdvwDados.CurrentRow.Cells[1].Value.ToString();
                    }
                    else
                    {
                        Control[] c = tabPage1.Controls.Find(this.campos[0].ComponenteCampo, true);
                        valorChave = c[0].Text;
                        Control[] c2 = tabPage1.Controls.Find(this.campos[1].ComponenteCampo, true);
                        valorChave2 = c2[0].Text;
                    }
                    findRowComposto(valorChave, valorChave2);
                }
            }
            else
            {
                clearFields();
            }
            habilitaBotoes();
            btnSalvar.Enabled = false;
            insert = false;
            Control[] c1 = tabPage1.Controls.Find(campos[0].ComponenteCampo, true);
            c1[0].Enabled = false;
        }

        private void tlstrpbtnExcluir_Click(object sender, EventArgs e)
        {
            if (habExcluir)
            {
                if (MessageBox.Show(("Deseja realmente excluir este registro?"), "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Question) == DialogResult.Yes)
                {
                    delete();
                }
            }

        }

        public void delete()
        {
            string sql = "";
            if (cod_anexo == null)
            {
                sql = SqlCrud.getInstance.deleteById(this.tabela, this.campos[0].Campo, getId());
            }
            else
            {
                sql = SqlCrud.getInstance.deleteByIdComposto(this.tabela, this.campos[0].Campo, getId(),
                    this.campos[0].Campo, getId2());
            }
            try
            {
                Conexao.getInstance.execute(sql);

                int indice = 0;
                if (grid.dtgrdvwDados.RowCount > 0)
                {
                    indice = grid.dtgrdvwDados.CurrentRow.Index;
                }

                if (this.grid != null) { this.grid.carregaGrid(); }
                if (grid.dtgrdvwDados.RowCount == 0)
                {
                    this.Close();
                }
                else
                {
                    if (indice < grid.dtgrdvwDados.RowCount)
                    {
                        if (cod_anexo == null)
                        {
                            grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[0, indice];
                        }
                        else
                        {
                            grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[1, indice];
                        }
                    }
                    else
                    {
                        if (cod_anexo == null)
                        {
                            grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[0, indice - 1];
                        }
                        else
                        {
                            grid.dtgrdvwDados.CurrentCell = grid.dtgrdvwDados[1, indice - 1];
                        }

                    }
                    if (cod_anexo == null)
                    {
                        findRow(grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString());
                    }
                    else
                    {
                        findRowComposto(grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString(),
                            grid.dtgrdvwDados.CurrentRow.Cells[1].Value.ToString());
                    }
                }

                //MessageBox.Show(this.Text + " excluido com sucesso!", "Aviso", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            catch (Exception ex)
            {
                MessageBox.Show("Não foi possível excluir o registro! \n\nERRO: " + ex.Message + "\n\nSQL: " + sql, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error);
            }

        }



        public void alteraSalvar(object sender, EventArgs e)
        {
            alteraSalvar();
        }

        public void alteraSalvar()
        {
            if (habSalvar)
            {
                if (insert)
                {
                    btnSalvar.Enabled = true;
                    if (!tlstrpbtnGravar.Enabled)
                    {
                        habilitaBotoes();
                    }
                }
                else
                {
                    if (!tlstrpbtnGravar.Enabled && habAlterar)
                    {
                        if (!controleAlter)
                        {
                            habilitaBotoes();
                            btnSalvar.Enabled = true;
                        }
                    }
                }
            }
        }

        public void ajustaBotoesMovimentacao()
        {
            if (grid.dtgrdvwDados.RowCount > 1)
            {
                tlstrpbtnPrimeiro.Enabled = true;
                tlstrpbtnAnterior.Enabled = true;
                tlstrpbtnProximo.Enabled = true;
                tlstrpbtnUltimo.Enabled = true;

                if (grid.dtgrdvwDados.CurrentCell.RowIndex == 0)
                {
                    tlstrpbtnPrimeiro.Enabled = false;
                    tlstrpbtnAnterior.Enabled = false;
                }
                else if (grid.dtgrdvwDados.CurrentCell.RowIndex == grid.dtgrdvwDados.RowCount - 1)
                {
                    tlstrpbtnProximo.Enabled = false;
                    tlstrpbtnUltimo.Enabled = false;
                }
            }
            else
            {
                tlstrpbtnPrimeiro.Enabled = false;
                tlstrpbtnAnterior.Enabled = false;
                tlstrpbtnProximo.Enabled = false;
                tlstrpbtnUltimo.Enabled = false;
            }
        }

        private void tlstrpbtnPrimeiro_Click(object sender, EventArgs e)
        {
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                grid.tlstrpbtnPrimeiro_Click(sender, e);
                carregaDados();
            }
            ajustaBotoesMovimentacao();
        }

        private void tlstrpbtnAnterior_Click(object sender, EventArgs e)
        {
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                int index = grid.dtgrdvwDados.CurrentCell.RowIndex - 1;
                if (index >= 0)
                {
                    grid.tlstrpbtnAnterior_Click(sender, e);
                    carregaDados();
                }
                ajustaBotoesMovimentacao();
            }
        }

        private void tlstrpbtnProximo_Click(object sender, EventArgs e)
        {
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                int index = grid.dtgrdvwDados.CurrentCell.RowIndex + 1;
                if (index < grid.dtgrdvwDados.RowCount)
                {
                    grid.tlstrpbtnProximo_Click(sender, e);
                    carregaDados();
                }
                ajustaBotoesMovimentacao();
            }
        }

        private void tlstrpbtnUltimo_Click(object sender, EventArgs e)
        {
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                grid.tlstrpbtnUltimo_Click(sender, e);
                carregaDados();
            }
            ajustaBotoesMovimentacao();
        }

        private void carregaDados()
        {
            if (grid.dtgrdvwDados.RowCount > 0)
            {
                if (cod_anexo == null)
                {
                    findRow(grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString());
                }
                else
                {
                    findRowComposto(grid.dtgrdvwDados.CurrentRow.Cells[0].Value.ToString(),
                        grid.dtgrdvwDados.CurrentRow.Cells[1].Value.ToString());
                }
            }
            else
            {
                this.Close();
            }
        }

        private void FormCadastro_FormClosing(object sender, FormClosingEventArgs e)
        {
            if (btnSalvar.Enabled)
            {
                DialogResult dr = MessageBox.Show("Descartar alterações?", "Saindo", MessageBoxButtons.YesNo, MessageBoxIcon.Question);
                if (dr == DialogResult.No)
                {
                    try
                    {
                        EventArgs ea = new EventArgs();
                        tlstrpbtnGravar_Click(sender, ea);
                    }
                    catch
                    {
                        e.Cancel = true;
                    }
                }
            }
        }

        private void FormCadastro_FormClosed(object sender, FormClosedEventArgs e)
        {
            controleAlter = true;
            if (tlstrpbtnCancelar.Enabled)
            {
                habilitaBotoes();
            }
        }

        private void tlstrpbtnRefresh_Click(object sender, EventArgs e)
        {
            carregaDados();
        }

        public virtual bool validacaoAdicional()
        {
            return true;
        }

        protected override bool ProcessCmdKey(ref Message msg, Keys keyData)
        {
            if (keyData == (Keys.F5))
            {
                if (tlstrpbtnIncluir.Enabled)
                {
                    tlstrpbtnIncluir_Click(null, null);
                }
                return true;
            }
            else if (keyData == Keys.F6)
            {
                if (tlstrpbtnAlterar.Enabled)
                {
                    tlstrpbtnAlterar_Click(null, null);
                }
            }
            else if (keyData == Keys.F7)
            {
                if (tlstrpbtnExcluir.Enabled)
                {
                    tlstrpbtnExcluir_Click(null, null);
                }
            }
            else if (keyData == Keys.F12)
            {
                if (tlstrpbtnGravar.Enabled)
                {
                    tlstrpbtnGravar_Click(null, null);
                }
            }
            else if (keyData == Keys.Escape)
            {
                if (tlstrpbtnCancelar.Enabled)
                {
                    tlstrpbtnCancelar_Click(null, null);
                }
            }
            else if (keyData == (Keys.Control | Keys.R))
            {
                if (tlstrpbtnRefresh.Enabled)
                {
                    tlstrpbtnRefresh_Click(null, null);
                }
            }
            return base.ProcessCmdKey(ref msg, keyData);
        }

    }
}
